﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.entidade;
using EnterpriseLibraryWrapper;
using System.Data;
using System.Collections;

namespace itau.im.dado
{
    public class ControleAcessoMock : IControleAcessoDAO
    {
        #region Métodos

        public IList<GrupoAcesso> ObterGruposNotificacao()
        {
            List<GrupoAcesso> listaRetorno = new List<GrupoAcesso>();
            IDataAccessWrapper data = null;
            DataSet dsRetorno = new DataSet();

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                //TODO:simulando mock, pois as tabelas nao estao definidas
                //dsRetorno = data.ExecuteDataSet("CONTROLEACESSOBS.OBTERGRUPOSNOTIFICACAO");

                if (dsRetorno.Tables.Count > 0 && dsRetorno.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in dsRetorno.Tables[0].Rows)
                    {
                        listaRetorno.Add(EntidadeFactory.getGruposDisponiveis(linha));
                    }
                }

                return listaRetorno;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listaRetorno = null;
                data.Dispose();
                data = null;
                dsRetorno = null;
            }

            return new List<GrupoAcesso>();
        }

        public IList<GrupoAcesso> ObterGruposDisponiveis()
        {
            List<GrupoAcesso> listaRetorno = new List<GrupoAcesso>();
            IDataAccessWrapper data = null;
            DataSet dsRetorno;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                //TODO:simulando mock, pois as tabelas nao estao definidas
                dsRetorno = data.ExecuteDataSet("CONTROLEACESSOBS.OBTERGRUPOSDISPONIVEIS");

                if (dsRetorno.Tables.Count > 0 && dsRetorno.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in dsRetorno.Tables[0].Rows)
                    {
                        listaRetorno.Add(EntidadeFactory.getGruposDisponiveis(linha));
                    }
                }

                return listaRetorno;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listaRetorno = null;
                data.Dispose();
                data = null;
                dsRetorno = null;
            }

            return new List<GrupoAcesso>();
        }

        public IList<GrupoAcesso> ObterGruposAcesso()
        {
            IList<GrupoAcesso> lista = new List<GrupoAcesso>();
            IDataAccessWrapper data = null;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                //todo: esperando dúvida para nome da procedure
                DataSet ds = data.ExecuteDataSet("CONTROLEACESSOBS.OBTERDETALHESGRUPO");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getGrupoAcesso(linha));
                    }
                }

                return lista;
            }

            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }

            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }

            finally
            {
                data.Dispose();
                data = null;
                lista = null;
            }

            return new List<GrupoAcesso>();
        }

        public IList<TipoAcesso> ObterTiposAcesso()
        {
            List<TipoAcesso> lista = new List<TipoAcesso>();
            IDataAccessWrapper data = null;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                DataSet ds = data.ExecuteDataSet("CONTROLEACESSOBS.OBTERTIPOSACESSO");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getTipoAcesso(linha));
                    }
                }
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                data.Dispose();
                data = null;
                lista = null;
            }

            return new List<TipoAcesso>();
        }

        public void SalvarAcessoParametro(IDictionary parGrupoTipoAcesso)
        {
            IDataAccessWrapper data = null;

            //TODO: Falta implementar
            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                //TODO: CONFORME EM RESPOSTA DO ANALISTA ESTE MÉTODO NÃO SERÁ COMTEMPLADO
                //NESTE MOMENTO, PORTANTO MONTAMOS SOMENTE SIMULADO.

                data.ExecuteNonQuery("CONTROLEACESSOBS.SALVARACESSOPARAMETRO");

            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                data.Dispose();
                data = null;
            }
        }

        public IList<Usuario> ObterUsuarios(int grupoAcessoID)
        {
            List<Usuario> lista = new List<Usuario>();
            DataSet ds;
            IDataAccessWrapper data = null;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_ACES_ID", Convert.ToInt32(grupoAcessoID), DbType.Int32));
                
                ds = data.ExecuteDataSet("CONTROLEACESSOBS.OBTERUSUARIOS");
                
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getUsuario(linha));
                    }
                }
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                ds = null;
                data.Dispose();
                data = null;
            }

            return new List<Usuario>();
        }

        #endregion
    }
}
